﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace sy5_9
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Text = "正弦函数"; // 设置窗体标题
            this.Size = new Size(400, 300); // 调整窗体大小以适配绘图
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; // 抗锯齿

            // 2. 计算坐标系中心（窗体宽高的1/2）
            float a = this.ClientSize.Width / 2;
            float b = this.ClientSize.Height / 2;
            g.TranslateTransform(a, b); // 平移坐标系到窗体中心

            // 3. 绘制坐标轴（x轴、y轴）
            Pen p = new Pen(Color.Red, 3);
            p.EndCap = LineCap.ArrowAnchor; // 设置线帽为箭头
            g.DrawLine(p, -a, 0, a, 0); // 绘制x轴（左右延伸）
            g.DrawLine(p, 0, -b, 0, b); // 绘制y轴（上下延伸）

            // 4. 初始化画刷、字体（用于绘制刻度）
            SolidBrush sb = new SolidBrush(Color.Black);
            Font f = new Font("宋体", 10, FontStyle.Bold);
            p.Color = Color.Black;
            p.Width = 1;
            p.EndCap = LineCap.Flat;

            // 5. 计算放大倍数t：让x轴范围适配[-π, π]
            const float PI = (float)Math.PI;
            float t = (this.ClientSize.Width - 40) / (2 * PI); // 实验公式：(宽度-40)/2π

            // 6. 绘制x轴刻度（从-3到3，对应[-π, π]）
            for (int i = -3; i <= 3; i++)
            {
                // 绘制刻度线（x轴上的短竖线）
                g.DrawLine(p, t * i, 0, t * i, -5);
                // 绘制刻度数值（如-3、-2...3）
                g.DrawString(i.ToString(), f, sb, t * i - 6, 0);
            }

            // 7. 绘制正弦曲线y=sin(x)
            p.Color = Color.Blue;
            p.Width = 2;
            float x1, y1, x2, y2;

            // 循环绘制正弦曲线（x从-π到π，步长0.01f）
            for (float j = -PI; j < PI; j += 0.01f)
            {
                // 计算当前点坐标（x=j*t，y=-sin(j)*t，负号修正y轴方向）
                x1 = j * t;
                y1 = -(float)Math.Sin(j) * t;
                // 计算下一个点坐标
                x2 = (j + 0.01f) * t;
                y2 = -(float)Math.Sin(j + 0.01f) * t;
                // 绘制两点之间的线段（构成连续曲线）
                g.DrawLine(p, x1, y1, x2, y2);
            }

            // 8. 释放资源
            p.Dispose();
            sb.Dispose();
            f.Dispose();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Refresh(); // 触发Paint事件，执行绘制逻辑
        }

       
    }
}
